﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ModelUML
{
    [Serializable]
    public class OperacjaUML : ElementUML
    {
        public override List<string> Validate()
        {
            List<String> lista = new List<string>();
            if (Nazwa.Length == 0) lista.Add("operacja nie ma nazway");
            else
            {
                foreach (char c in Nazwa)
                {
                    if (!char.IsLetterOrDigit(c) && !c.Equals('_'))
                    {
                        lista.Add(String.Format("operacja \"{0}\" posiada nieprawidłowe znaki w nazwie", Nazwa));
                        break;
                    }
                }
            }
            if (this.Typ != null)
            {
                bool found = false;
                foreach (ElementUML el in Model1.staticModel.Elementy)
                {
                    if (el.JestTypemDanych)
                    {
                        if (this.Typ.Nazwa.Equals(el.Nazwa))
                        {
                            found = true;
                            break;
                        }
                    }
                }
                if (!found) lista.Add(String.Format("operacja \"{0}\" zwraca wynik nieznanego typu: \"{1}\"", Nazwa, Typ.Nazwa));
            }
            foreach (AtrybutUML at in this.atrybuty)
            {
                lista.AddRange(at.Validate());
            }
            return lista;
        }
        public OperacjaUML(String nazwa, TypDanychUML returnType) {
            Typ = returnType;
            Nazwa = nazwa;
            atrybuty = new KolekcjaUML();
            Visibility = VisibilityKindUML.package;
        }

        public void UsunAtrybuty()
        {
            atrybuty.Wyczysc();
        }

        internal KolekcjaUML atrybuty;
        public void DodajAtrybut(AtrybutUML atrybut)
        {
            atrybuty.Dodaj(atrybut);
        }
        public int IloscAtrybutow
        {
            get
            {
                return atrybuty.Count;
            }
        }
        public AtrybutUML GetAtrybut(int index){
            return (AtrybutUML)atrybuty[index];
        }                
    
        TypDanychUML returnType;
        public TypDanychUML Typ
        {
            get
            {
                return returnType;
            }
            set
            {
                returnType = value;
            }
        }
        public bool CzyZwracaWynik
        {
            get
            {
                if (returnType == null) return false;
                else return true;
            }
        }
    }
}
